﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace example {
using System.Collections.Generic;
public interface ISubconsumer {
  event Action<string> output;
  void input(IList<string> message);
}
public partial class consumer : IConsumer {
  public event Action<string> output;

  private Action<IList<string>> _input;
  public void input(IList<string> message) {
    _input(message);
  }
  public consumer(ISubconsumer subconsumer) {
    this._input += subconsumer.input;
    subconsumer.output += m => this.output(m);
  }
}

}
namespace example {
using ebcpatterns;
public interface ISuperConsumer1 {
  event Action<string> Result;
  void Process(string message);
}
public interface ISuperConsumer2 {
  event Action<string> Result;
  void Process(string message);
}
public interface ICoolesDesignerBoards {
  event Action<string> Result;
  void Run(string message);
}
public partial class CoolesDesignerBoards : ICoolesDesignerBoards {
  public event Action<string> Result;

  private Action<string> _Run;
  public void Run(string message) {
    _Run(message);
  }
  public CoolesDesignerBoards(ISuperConsumer1 superConsumer1, ISplit<string,string,string> split1, ISuperConsumer2 superConsumer2, IJoin<string,string,string> join1) {
    this._Run += split1.Input;
    superConsumer1.Result += join1.Input1;
    split1.Output1 += superConsumer1.Process;
    split1.Output2 += superConsumer2.Process;
    superConsumer2.Result += join1.Input2;
    join1.Output += m => this.Result(m);
  }
}

}
namespace example {
using System.Collections.Generic;
public interface IProducer {
  event Action<IList<string>> output;
  void input(string message);
}
public interface IConsumer {
  event Action<string> output;
  void input(IList<string> message);
}
public interface IMainboard {
  event Action<string> output;
  void input(string message);
}
public partial class mainboard : IMainboard {
  public event Action<string> output;

  private Action<string> _input;
  public void input(string message) {
    _input(message);
  }
  public mainboard(IProducer producer, IConsumer consumer) {
    this._input += producer.input;
    producer.output += consumer.input;
    consumer.output += m => this.output(m);
  }
}

}
namespace example {
using ebcpatterns;
public interface IA {
  event Action<string> Output;
  void Input(string message);
}
public interface IB {
  event Action<string> Output;
  void Input(string message);
}
public interface IC {
  event Action<string> Output;
  void Input(Tuple<string,string> message);
}
public interface ISplitAndJoin {
  event Action<string> Output;
  void Input(string message);
}
public partial class SplitAndJoin : ISplitAndJoin {
  public event Action<string> Output;

  private Action<string> _Input;
  public void Input(string message) {
    _Input(message);
  }
  public SplitAndJoin(IA a, IB b, IC c) {
  var __join1 = new Join<string,string,Tuple<string,string>>();    this._Input += a.Input;
    a.Output += b.Input;
    a.Output += __join1.Input1;
    b.Output += __join1.Input2;
    __join1.Output += c.Input;
    c.Output += m => this.Output(m);
  }
}

}
